[2]DaqoRTU配置说明
一、功能描述
DaqoRTU APP是通用型采集APP,目前主要支持MODBUS、DL645(07)规约。
主要特点如下:
- 通过sqlite3 db配置文件配置采集模型、采集档案;
- 根据配置文件自动生成数据中心测点模型、参数模型,以及ROMA平台物模型文件;
- 支持多种预配置测点类型解析,对于定制化解析需求的测点,可通过LUA脚本表达式进行扩展;
- 支持单线程、多线程运行模式,每个通道可扩展运行脚本文件。
二、使用说明
2.1 配置文件说明
主要配置文件:
config.db:APP组态配置文件,主要配置表如下:
- Basic,用于配置APP运行参数,例如MQTT BROKER地址,多线程运行模式等;
- Comm,用于配置通讯端口、协议及通讯参数
- Dev,用于配置设备列表,主要包括挂接的串口,模型,地址等信息
模型配置DB文件,例如RCD.db、RTU.db,主要配置表如下:
- Basic,用于配置设备基本信息,例如产品名称、厂家ID、厂家名、通讯协议、版本及描述等信息;
- PARAM,用于配置设备参数表,例如参数名称、描述、默认值、单位、类型、比例、偏置、解析类型、通讯解析相关参数信息等;
- YC, 用于配置设备遥测表,例如遥测名称、描述、默认值、单位、类型、比例、偏置、死区、是否上报、解析类型、通讯解析相关参数信息等;
- YX, 用于配置设备遥信表,例如遥信名称、描述、默认值、单位、类型、比例、偏置、死区、是否上报、解析类型、通讯解析相关参数信息等;
2.1 用户数据类型
USERTYPE 主要数据类型如下:
NONE, //无类型,不处理
UINT16BE, //UINT16大端模式
UINT16LE, //UINT16小端模式
UINT32BE, //UINT32大端模式
UINT32LE, //UINT32小端模式
UINT64BE, //UINT64大端模式
UINT64LE, //UINT64小端模式
INT16BE, //INT16BE大端模式
INT16LE, //INT16BE小端模式
INT32BE, //INT32大端模式
INT32LE, //INT32小端模式
INT64BE, //INT64大端模式
INT64LE, //INT64小端模式
FP32BE, //float 大端模式
FP32LE, //float 小端模式
FP64BE, //double 大端模式
FP64LE, //double 小端模式
BIT0, //取第0位
BIT1,
BIT2,
BIT3,
BIT4,
BIT5,
BIT6,
BIT7,
BIT8,
BIT9,
BIT10,
BIT11,
BIT12,
BIT13,
BIT14,
BIT15, //取第15位
LUA //自定义脚本方式
2.2 采集分组方法
APP采集支持分组、不同周期间隔进行采集功能,例如遥测、遥信以不同采集周期进行数据采集,方法如下:
TASKID: 采集任务分组ID号,对于LUA脚本测点类型,TASKID需要设置>=200
TASK_PERIOD: 采集任务周期(单位秒)
2.3 自定义脚本方法
当USERTYPE数值为LUA类型时,表示使用LUA脚本表达式对数据单元进行解析,脚本范例:
return IGetYcValByTag("PhV_phsA")+IGetYcValByTag("PhV_phsB");
系统支持的自定义函数如下:
根据序号获取遥测
float IGetYcVal(int nId);
根据序号获取遥信
int IGetYxVal(int nId);
根据测点TAG获取遥测
float IGetYcValByTag(const char* strTag);
根据测点TAG获取遥信
int IGetYxValByTag(const char* strTag);
根据序号设置遥测
void ISetYcVal(int nId, float fVal);
根据TAG设置遥测
void ISetYcValByTag(const char* strTag, float nVal);
根据序号设置遥信
void ISetYxVal(int nId, int nVal);
根据TAG设置遥信
void ISetYxValByTag(const char* strTag, int nVal);
---------------------------------------------------
当前解析缓存获取uint8
unsigned char IGetUint8(int nOffset);
当前解析缓存获取int8
char IGetInt8(int nOffset);
当前解析缓存获取uint16大端
unsigned short IGetUint16BE(int nOffset);
当前解析缓存获取uint16小端
unsigned short IGetUint16LE(int nOffset);
当前解析缓存获取int16大端
short IGetInt16BE(int nOffset);
当前解析缓存获取int16小端
short IGetInt16LE(int nOffset);
当前解析缓存获取uint32大端
unsigned int IGetUint32BE(int nOffset);
当前解析缓存获取uint32小端
unsigned int IGetUint32LE(int nOffset);
当前解析缓存获取int32大端
int IGetInt32BE(int nOffset);
当前解析缓存获取int32小端
int IGetInt32LE(int nOffset);
当前解析缓存获取float大端
float IGetFloatBE(int nOffset);
当前解析缓存获取float小端
float IGetFloatLE(int nOffset);
当前解析缓存获取位数值
unsigned char IGetBitValue(int nOffset, int nReadBitPos);
当前解析缓存获取uint64大端
unsigned long long IGetUint64BE(int nOffset);
当前解析缓存获取uint64小端
unsigned long long IGetUint64LE(int nOffset);
当前解析缓存获取int64大端
long long IGetInt64BE(int nOffset);
当前解析缓存获取int64小端
long long IGetInt64LE(int nOffset);
当前解析缓存获取double大端
double IGetDoubleBE(int nOffset);
当前解析缓存获取double小端
double IGetDoubleLE(int nOffset);
当前解析缓存获取位域数值
unsigned int IGetBitArea(int nOffset, int nStartBitPos, int nBitCount);
---------------------------------------------------
BCD数值转HEX
uint64 Bcd2Hex64(uint64 b64);
BCD数值转浮点
double Bcd2F(uint64 value, uint8 dot);
2.4 虚拟遥测、遥信用法
TASKID配置200及以上时,表示虚拟测点,仅执行脚本表达式,用于计算虚遥测、遥信信息; 通讯中关于modbus功能码、起始地址、寄存器个数字段无效。
2.5 关于自定义处理脚本
该APP支持脚本回调函数功能,主要定义初始化、设备轮询、控制命令回调等预定义回调函数。
初始化回调函数(OnTaskInit
)用于设置通讯句柄、控制命令参数等脚本用全局变量;
设备轮询任务回调函数(OnDevPoll
)用于处理单台设备自定义召测任务,可对于特殊指令进行特殊召测处理;
控制命令回调函数(OnCommandRequest
)用于处理设备控制消息,将标准控制命令进行格式转换,下发到装置进行处理;
例如:
-----------------------------------------------------
-- 全局变量
-----------------------------------------------------
local g_pMB = nil; -- 通讯控制句柄
local g_pCmdJob = nil; -- 当前正在处理的任务节点(OnCommandRequest回调函数使用)
-- 初始化任务
function OnTaskInit(nArgIndex, pArgData)
if nArgIndex == 0 then
g_pMB = pArgData;
elseif nArgIndex == 1 then
g_pCmdJob = pArgData;
end
return 1;
end
-- 单台设备自定义轮询任务
function OnDevPoll(nTickPass, pDevItem)
--print("nTickPass = " .. nTickPass);
--print("pDevItem = " .. tostring(pDevItem) );
return 1;
end
-- 遥控命令回调函数
function OnCommandRequest()
local dev = IGetCmdJob_Arg(g_pCmdJob, 0); --设备实例
local name = IGetCmdJob_Arg(g_pCmdJob, 1); --命令名称
local cmd_type = IGetCmdJob_Arg(g_pCmdJob, 2); --命令类型
local cmd = tonumber(IGetCmdJob_Arg(g_pCmdJob, 3)); --命令
local action = tonumber(IGetCmdJob_Arg(g_pCmdJob, 4)); --动作
local mode = tonumber(IGetCmdJob_Arg(g_pCmdJob, 5)); --控制模式
local timeout = tonumber(IGetCmdJob_Arg(g_pCmdJob, 6)); --超时时间
local devAddr = tonumber(IGetCmdJob_Arg(g_pCmdJob, 10)); --装置地址
local reg_addr = 0x0000;
local reg_val = 0x0000;
local nRet;
print("dev = " .. dev);
print("name = " .. name);
print("cmd_type = " .. cmd_type);
print("cmd = " .. cmd);
print("action = " .. action);
print("mode = " .. mode);
print("timeout = " .. timeout);
-- 控制对象匹配判断
startIndex, endIndex = string.find(name, 'cmd_obj_');
--print(startIndex);
--print(endIndex);
if startIndex >= 0 then
strRegAddr = string.sub(name, endIndex+1);
reg_addr = tonumber(strRegAddr, 16);
--print(reg_addr);
else
return 0; -- 不是可处理的控制命令
end
if cmd == 1 then
reg_val = 0xFF00;
end
-- 下发控制命令
nRet = MBM_ForceSingleDigitOut(g_pMB, devAddr, reg_addr, reg_val);
if nRet > 0 then
print("MBM_ForceSingleDigitOut: addr=" .. devAddr .. " reg_addr=" .. reg_addr .. " reg_val=" .. reg_val .. " OK.");
else
print("MBM_ForceSingleDigitOut: addr=" .. devAddr .. " reg_addr=" .. reg_addr .. " reg_val=" .. reg_val .. " FAIL.");
end
return 1;
end